<?php

/**
 * Абстрактный класс для контекста окружения
 *
 * @abstract
 * @package mumak
 * @subpackage core
 */
abstract class RL_Context
{

	/**
	 * Объект RH
	 *
	 * @var RL_SiteRequestHandler
	 */
	public $rh;

	/**
	 * Конструктор только устанавливает ссылку на RH
	 *
	 * @final
	 * @param RL_SiteRequestHandler $rh
	 */
	public final function __construct( RL_SiteRequestHandler $rh )
	{
		$this->ctx = $this;
		$this->rh = $rh;
	}

	/**
	 * Создает нужный тип окружения
	 *
	 * @static
	 * @param RL_SiteRequestHandler $rh
	 * @param string $context_type [Site|Cron|Cms]
	 * @return RL_Context
	 */
	public static final function createContext ( RL_SiteRequestHandler $rh , $context_type )
	{
		$class_name = "RL_Context_" . ucfirst(strtolower($context_type));
		if( $rh->useClass($class_name) ) {
			$instance = new $class_name ( $rh );
			if (!$instance instanceof RL_Context) {
				throw new RL_Exception("Класс $class_name не является наследником " . __CLASS__);
				return false;
			} else {
				$instance->create(); // сам процесс создания
				return $instance;
			}
		} else {
			throw new RL_Exception("Класс $class_name не найден в Context");
			return false;
		}
	}

	//!a manipulator
	/**
	 * register зарегистрировать объект $o под именем $name.
	 *
	 * Использовать вместо $ctx->$name = $o;
	 *
	 * @param mixed $name имя объекта
	 * @param mixed $o объект
	 * @access public
	 * @return Object $this
	 */
	public function register ($name, $o)
	{
		$this->$name = $o;
		return $this;
	} // end of function register

	/**
	 * Создание самого рабочего окружения
	 *
	 * @abstract
	 * @return void
	 */
	abstract protected function create ();
}
?>
